#include <iostream>
using namespace std;

int getAA1(){
        int a;
        a = 10;
        return a;
}
//返回a的本身 返回a的一个副本
int& getAA2(){
        int a; //如果是返回栈上的 引用 有可能有问题
        a = 10;
        return a;
}
int* getAA3(){
        int a;
        a = 10;
        return &a;
}
int main01(int argc, char const *argv[]){
/*
        int a1 = 0;
        int a2 = 0;
        
        a1 = getAA1();
        a2 = getAA2();
        int &a3 = getAA2();

        printf("a1:%d \n", a1);
        printf("a2:%d \n", a2);
        printf("a3:%d \n", a3);
*/
        return 0;
}

//变量是static 或者全局变量
int j1(){
        static int a = 10;
        a++;
        return a;
}
int& j2(){
        static int a = 10;
        a++;
        return a;
}
//若返回静态变量或全局变量
//      可以成为其他引用的初始值
//      即可作为右值使用,也可以作为左值使用
int main02(int argc, char const *argv[]){
        int a1 = 10;
        int a2 = 10;
        
        a1 = j1();
        a2 = j2();
        int &a3 = j2();

        printf("a1: %d \n", a1);
        printf("a2: %d \n", a2);
        printf("a3: %d \n", a3);

        return 0;
}

//函数当左值
int g1(){
        static int a = 10;
        a++;
        return a; //返回变量的值
}
int& g2(){
        static int a = 10;
        a++;
        printf("a = %d \n", a);
        return a; //返回变量本身
}
int main(int argc, char const *argv[]){
        //g1() = 100; //c++编译器编译不通过 相当于11=100；这句话不成立

        //函数返回值是一个引用，并且当左值
        g2() = 100; //相当于a = 100; 后期操作符函数重载 链式编程 要使用到这个特性
        g2();

        int c = g2(); //函数返回值是一个引用，并且当右值
        printf("c:%d \n",c);
        return 0;
}
